package com.cskaoyan.mall.product.controller;

import com.cskaoyan.mall.common.result.Result;
import io.minio.BucketExistsArgs;
import io.minio.MakeBucketArgs;
import io.minio.MinioClient;
import io.minio.PutObjectArgs;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.InputStream;
import java.util.UUID;

/**
 * @Author Pudding
 * @Date 2024/6/30 11:02
 */

@RestController
@RequestMapping("admin/product")
//@ConfigurationProperties(prefix = "minio") //下面取到的前提是，变量名和配置文件中的名字一致，这个注解必须要放在配置类上面
public class AdminFileUploadController {
    //  获取文件上传对应的地址
    @Value("${minio.endpointUrl}")
    public String endpointUrl;  //endpointUrl: http://47.96.11.99:9001

    @Value("${minio.accessKey}")
    public String accessKey;  //accessKey: admin

    @Value("${minio.secreKey}")
    public String secreKey; //secreKey: admin123456

    @Value("${minio.bucketName}")
    public String bucketName;  //bucketName: item-images

    //  文件上传控制器
    @PostMapping("fileUpload")
    public Result<String> fileUpload(MultipartFile file) throws Exception {  //对于二进制文件，使用MultipartFile接收！

        //1. 使用MinIO服务的URL，端口，Access key和Secret key创建一个MinioClient客户端对象
        MinioClient minioClient = MinioClient.builder()
                .endpoint(endpointUrl)
                .credentials(accessKey, secreKey)
                .build();

        //2. 操作API
        //2.1 检查存储桶是否已经存在
        boolean isExist = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
        if (isExist) {
            System.out.println("Bucket already exists.");
        } else {
            // 创建一个名为asiatrip的存储桶，用于存储照片的zip文件。
            minioClient.makeBucket(MakeBucketArgs.builder()
                    .bucket(bucketName)
                    .build());
        }

        //  定义一个文件的名称 : 文件上传的时候，名称不能重复！
        String fileName = System.currentTimeMillis() + UUID.randomUUID().toString().replace("-", "");
        //2.1 使用putObject上传一个文件到存储桶中。
        InputStream inputStream = file.getInputStream();
        minioClient.putObject(PutObjectArgs.builder()
                .bucket(bucketName)  //设置桶的名称
                .object(fileName) //设置文件名称
                .stream(inputStream, file.getSize(), -1) //文件输入流，其中file.getSize()指定输入流的大小，-1表示传输整个输入流。
                .contentType(file.getContentType()) //设置上传文件的Content-Type。
                .build());

        //  准备获取到上传的文件路径！
        String url = endpointUrl + "/" + bucketName + "/" + fileName;
        System.out.println("url:\t" + url);

        //关闭流
        inputStream.close();

        //3. 将文件上传之后的路径返回给页面！
        return Result.ok(url);
    }
}
